【Pwn 笔记】Windows Pwn 环境搭建

膜 EX 师傅和 Byzero512 师傅

检查程序保护的方法

这里要用到的脚本是 winchecksec,在 github 上面开源

地址为:https://github.com/trailofbits/winchecksec

在本地起端口的方法

安装 win_server

这里使用 EX 师傅的脚本,项目源码地址:https://github.com/Ex-Origin/win_server

用 nc 连上端口后就可以用 Windbg 来调试附加进程,即:Attach to a Process(快捷键是 F6)

用这个方法的话可以先在脚本的前面加个输入函数,来中断程序的运行,之后断点断在要调试的程序内第一个输入函数的后面即可

不过我不推荐用这个方法调试,这个工具最适合的还是起端口

安装 Windbg

我的电脑不支持 Windbg 首页发布的 Windbg 和 Preview 版本

因为我的电脑的一个组件的版本略高Kit Windows 10.0.18362.1,首页的 Windbg 支持Kit Windows 10.0.18362.0

支持Kit Windows 10.0.18362.1的 Windbg 的下载地址:

1
2
https://download.microsoft.com/download/4/2/2/42245968-6A79-4DA7-A5FB-08C0AD0AE661/windowssdk/Installers/X86%20Debuggers%20And%20Tools-x86_en-us.msi
https://download.microsoft.com/download/4/2/2/42245968-6A79-4DA7-A5FB-08C0AD0AE661/windowssdk/Installers/X64%20Debuggers%20And%20Tools-x64_en-us.msi

用 winpwn 调试程序

安装 winpwn

这里使用的是 Byzero512 师傅所写的脚本

项目开源地址:https://github.com/Byzero512/winpwn

现阶段改脚本需要改一些参数,才能适合于自己的环境

安装 TWindbg

原本的 Windbg 看起来很费劲,所以这里装插件来适应,这个插件是把 Windbg 的命令窗口改成类似 gdb-peda 的样式,便于调试

我一般是放 Memory(内存)窗口在上面,Command(命令)窗口在下面,内存窗口用于看各地址周围详细情况

项目地址:https://github.com/bruce30262/TWindbg

按照步骤,先安装 pykd-ext

1
https://githomelab.ru/pykd/pykd-ext/-/wikis/Downloads

点击上方链接下载最新版本的 pykd-ext,之后解压

再把对应的 pykd.dll 文件分别复制到 Windbg x86 和 Windbg x64 的 winext 文件夹里即可

之后我发现在 Windbg 里安装 pykd 会出错,错误如下:

1
ValueError: signal only works in main thread

而且默认用的 pip 是 Python 3 的,因为 pykd 在以后的版本里更倾向于能继续发展的 Python 3

所以这里我采用下载源文件包的形式来安装 pykd

下载地址在:https://githomelab.ru/pykd/pykd/-/wikis/home

选择 Last Release 来进行后续的下载,之后安装即可:

1
pip3 install .\pykd-0.3.4.12-cp38-none-win_amd64.whl

最后把 TWindbg 文件夹里面的 TWindbg 文件夹复制两份分别到 Windbg x86 和 Windbg x64 的 winext 文件夹里即可

安装 Cmder

其实改一改脚本的话用不到这个东西,原因写在下面的文章里

但是我下下来以后发现这个东西真的是太香了,所以就也写这了

下载地址:https://cmder.net/

如果不需要过多的 linux 命令和 cygwin-gcc 的话就没有必要安装 Cygwin

而且这玩玩还自带 git 和 git bash,所以 git 一系列的东西也可以卸载了

这里再添加两个脚本,用来将用右键就可以启动 Cmder 的功能写入注册表的文件和删除这个操作的文件

ContextCmder-Enable(这个要按自己的路径改改).reg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\Cmder]
@="Open Cmder Here"
"Icon"="C:\\tools\\cmder\\Cmder.exe,0"

[HKEY_CLASSES_ROOT\Directory\Background\shell\Cmder\command]
@="\"C:\\tools\\cmder\\Cmder.exe\" \"%V\""

[HKEY_CLASSES_ROOT\Directory\shell\Cmder]
@="Open Cmder Here"
"Icon"="C:\\tools\\cmder\\Cmder.exe,0"

[HKEY_CLASSES_ROOT\Directory\shell\Cmder\command]
@="\"C:\\tools\\cmder\\Cmder.exe\" \"%1\""

ContextCmder-Disable.reg

1
2
3
4
Windows Registry Editor Version 5.00

[-HKEY_CLASSES_ROOT\Directory\Background\shell\Cmder]
[-HKEY_CLASSES_ROOT\Directory\shell\Cmder]

用 gdb 调试程序(失败)

安装 mingw-gdb

这玩玩可以在这下载:

https://nchc.dl.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/installer/mingw-w64-install.exe

安装 peda-windows(wibe)

安装作者写的脚本:https://github.com/Byzero512/peda-windows

不要用 .gdbinit,因为可能无效,直接把对 wibe 的调用写在 .winpwn 文件里即可

作者的脚本有些小缺陷,就是 gdb 调试的时候,gdb 所在的路径不能有空格

我们略作修改,使其支持空格路径,详情写在下面的使 gdb 支持空格路径

别忘了装里面的 vmmap

改改脚本

更改 HOME 环境变量为 HOMEPATH

之前作者说要用 Cmder 才能调试的原因是 Cmder 有 HOME 环境变量,但是正常情况下是没有的

正常情况下这个环境变量的名字是 HOMEPATH

更改如下,找到 var.py 脚本,路径大致如下:E:\Python27\Lib\site-packages\winpwn\var.py

将以下脚本替换:

1
winpwn_init=os.environ['HOME']+'\\.winpwn'

替换为

1
winpwn_init=os.environ['HOMEPATH']+'\\.winpwn'

之后就能随意运行调试文件了

使 gdb 支持空格路径

找到 misc.py 文件,路径大致如下:E:\Python27\Lib\site-packages\winpwn\misc.py

做如下修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def run_in_new_terminal(command, terminal = None, args = None):
if terminal is None:
if (context.terminal):
terminal=context.terminal
else:
terminal=['ConEmu.exe','-Reuse','-run']
if isinstance(args, tuple): # args associety with tmminal not process
args = list(args)
if args is not None:
argv=terminal+args
else:
argv=terminal
# print(argv,command)
if isinstance(command,str):
argv+=[command] # [terminal,args,command]
elif isinstance(command,(list,tuple)):
argv+=list(command)
ter=subprocess.Popen(argv)
return ter

替换为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def run_in_new_terminal(command, terminal = None, args = None):
if terminal is None:
if (context.terminal):
terminal=context.terminal
else:
terminal=['ConEmu.exe ','-Reuse ','-run ']
if isinstance(args, tuple): # args associety with tmminal not process
args = list(args)
if args is not None:
argv=terminal+args
else:
argv=terminal
# print(argv,command)
if isinstance(command,str):
argv+=[command] # [terminal,args,command]
elif isinstance(command,(list,tuple)):
argv+=list(command)
ter=subprocess.Popen(''.join(argv))
return ter

复制 github 项目上 winpwn 里面的 .winpwn 文件

先写好调试器的路径,再将其复制到 HOMEPATH 所对应的文件夹里即可

个人配置暂且如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"debugger":{
"i386": {
"x64dbg": "",
"gdb": "\"E:\\Program Files (x86)\\Dev-Cpp\\MinGW64\\bin\\gdb.exe\"",
"windbg": "E:\\Windows Kits\\10\\Debuggers\\x86\\windbg.exe"
},
"amd64": {
"x64dbg": "",
"gdb": "\"E:\\Program Files (x86)\\Dev-Cpp\\MinGW64\\bin\\gdb.exe\"",
"windbg": "E:\\Windows Kits\\10\\Debuggers\\x64\\windbg.exe"
}
},
"debugger_init": {
"i386": {
"x64dbg": "",
"gdb": "source E:\\CTF Tools\\Pwn\\peda-windows\\init.py",
"windbg": ".load pykd;!py -g winext\\TWindbg\\TWindbg.py;"
},
"amd64": {
"x64dbg": "",
"gdb": "source E:\\CTF Tools\\Pwn\\peda-windows\\init.py",
"windbg": ".load pykd;!py -g winext\\TWindbg\\TWindbg.py;"
}
}
}
文章目录
  1. 1. 检查程序保护的方法
  2. 2. 在本地起端口的方法
    1. 2.1. 安装 win_server
    2. 2.2. 安装 Windbg
  3. 3. 用 winpwn 调试程序
    1. 3.1. 安装 winpwn
    2. 3.2. 安装 TWindbg
    3. 3.3. 安装 Cmder
      1. 3.3.1. ContextCmder-Enable(这个要按自己的路径改改).reg
      2. 3.3.2. ContextCmder-Disable.reg
  4. 4. 用 gdb 调试程序(失败)
    1. 4.1. 安装 mingw-gdb
    2. 4.2. 安装 peda-windows(wibe)
  5. 5. 改改脚本
    1. 5.1. 更改 HOME 环境变量为 HOMEPATH
    2. 5.2. 使 gdb 支持空格路径
    3. 5.3. 复制 github 项目上 winpwn 里面的 .winpwn 文件
|